// src/utils/request.js
import website from '@/config/website';
import { removeToken } from "@/utils/auth"; // 假设有管理token的工具函数
import axios from "axios";
import { Base64 } from 'js-base64';
// import { ElMessage } from "element-plus"; // 假设使用Element Plus的提示组件（按需替换）
import { baseUrl } from '@/config/env';
import { useAuthStore } from '@/stores/auth';
import { isURL } from '@/utils/validate';
import NProgress from "nprogress"; // 可选：加载进度条
import "nprogress/nprogress.css";
import qs from "qs";

// 创建axios实例
const service = axios.create({
    timeout: 10000, // 超时时间 10秒
    withCredentials: false, // 跨域请求携带Cookie（需后端支持CORS）
    paramsSerializer: (params) => qs.stringify(params, { indices: false }), // 参数序列化（处理数组）
});

// 请求拦截器
service.interceptors.request.use(
    (config) => {
        NProgress.start(); // 开启进度条（可选）
        //地址为已经配置状态则不添加前缀
        // 确保baseUrl不为undefined且不为空
        if (baseUrl && !isURL(config.url) && !config.url.startsWith(baseUrl)) {
            config.url = baseUrl + config.url;
        }
        config.headers.Authorization = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`;
        // 添加认证头部（登录后的token）
        const authStore = useAuthStore()
        if (authStore.token) {
            config.headers[website.tokenHeader] = 'bearer ' + authStore.token;
        }
        return config;
    },
    (error) => {
        NProgress.done(); // 关闭进度条
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    (response) => {
        NProgress.done(); // 关闭进度条
        // 统一处理响应数据格式（根据后端规范调整）
        const res = response;
        //获取状态码
        const status = res.data.code || res.status;
        if (status == 200) {
            return res; // 返回业务数据
        } else {
            handleError(response, res.message || "请求失败");
            return Promise.reject(res);
        }
    },
    (error) => {
        NProgress.done();
        handleError(error);
        return Promise.reject(error);
    }
);

/** 统一处理错误 */
function handleError(error, customMessage = "") {
    let message = customMessage;

    if (error?.response) {
        // HTTP状态码相关错误
        switch (error.response.status) {
            case 401:
                message = "登录过期，请重新登录";
                removeToken();
                setTimeout(() => {
                    window.location.href = "/login";
                }, 1000);
                break;
            case 403:
                message = "权限不足，请联系管理员";
                break;
            case 500:
                message = "服务器异常，请稍后再试";
                break;
            default:
                message = `请求错误 [${error.response.status}]`;
        }
    } else if (typeof error?.message === 'string' && error.message.includes("timeout")) {
        message = "请求超时，请检查网络";
    } else if (error?.message === "Network Error") {
        message = "网络连接异常";
    }

    // ElMessage.error(message); // 展示错误提示
    console.error("请求错误:", error);
}


export default service;
